#ifndef SYS_GLOBAL_H
#define SYS_GLOBAL_H

#include <yonex/types.h>

typedef struct
{
    unsigned short limit_low;      // 段界限 0~15位
    unsigned int base_low : 24;    // 基地址 0~24位
    unsigned char type : 4;        // 段类型
    unsigned char segment : 1;     // 1表示代码段或数据段，0表示系统段
    unsigned char DPL : 2;         // 描述符特权级 Descriptor Privilege Level
    unsigned char present : 1;     // 存在位: 1在内存上，0在磁盘上
    unsigned char limit_hign : 4;  // 段界限 16~19位
    unsigned char available : 1;   // 保留
    unsigned char long_mode : 1;   // 64位扩展标志
    unsigned char big : 1;         // 1表示32位，0表示16位
    unsigned char granularity : 1; // 1表示粒度为4K，0表示粒度为1B
    unsigned char base_high;       // 基地址 25~31位
} __attribute__((packed)) descriptor_t;

typedef struct
{
    u16 limit;
    u64 base;
} __attribute__((packed)) pointer_t;

typedef struct
{
    unsigned char RPL : 2;      // 请求特权级
    unsigned char TI : 1;       // 0表示全局描述符，1表示局部描述符
    unsigned short index : 13;  // 全局描述符表索引
} __attribute__((packed)) selector_t;

void gdt_init();

#endif
